chore(deps): update dependency pylint to v4 #56
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^3.2.6->^4.0.0Release Notes
pylint-dev/pylint (pylint)
v4.0.2Compare Source
False Positives Fixed
Fix false positive for
invalid-nameon a partially uninferable module-level constant.Closes #10652
Fix a false positive for
invalid-nameon exclusive module-level assignmentscomposed of three or more branches. We won't raise
disallowed-nameon module-level names that can't be inferreduntil a further refactor to remove this false negative is done.
Closes #10664
Fix false positive for
invalid-nameforTypedDictinstances.Closes #10672
v4.0.1Compare Source
What's new in Pylint 4.0.1?
Release date: 2025-10-14
False Positives Fixed
Exclude
__all__and__future__.annotationsfromunused-variable.Closes #10019
Fix false-positive for
bare-name-capture-patternif a case guard is used.Closes #10647
Check enums created with the
Enum()functional syntax to pass against the--class-rgxfor theinvalid-namecheck, like other enums.Closes #10660
v4.0.0Compare Source
Pylint now supports Python 3.14.
Pylint's inference engine (
astroid) is now much more precise,understanding implicit booleanness and ternary expressions. (Thanks @zenlyj!)
Consider this example:
The required
astroidversion is now 4.0.0. See the astroid changelog for additional fixes, features, and performance improvements applicable to pylint.invalid-nameat the module level was patchy. Now,module-level constants that are reassigned are treated as variables and checked
against
--variable-rgxrather than--const-rgx. Module-level lists,sets, and objects can pass against either regex.
Here,
LIMITis reassigned, so pylint only uses--variable-rgx:If this is undesired, refactor using exclusive assignment so that it is
evident that this assignment happens only once:
Lists, sets, and objects still pass against either
const-rgxorvariable-rgxeven if reassigned, but are no longer completely skipped:
Remember to adjust the regexes and allow lists to your liking.
Breaking Changes
invalid-namenow distinguishes module-level constants that are assigned only oncefrom those that are reassigned and now applies
--variable-rgxto the latter. Valuesother than literals (lists, sets, objects) can pass against either the constant or
variable regexes (e.g. "LOGGER" or "logger" but not "LoGgEr").
Remember that
--good-namesor--good-names-rgxscan be provided to explicitlyallow good names.
Closes #3585
The unused
pylintrcargument toPyLinter.__init__()is deprecatedand will be removed.
Refs #6052
Commented out code blocks such as
# bar() # TODO: remove dead codewill no longer emitfixme.Refs #9255
pyreverseRunwas changed to no longer callsys.exit()in its__init__.You should now call
Run(args).run()which will return the exit code instead.Having a class that always raised a
SystemExitexception was considered a bug.Normal usage of pyreverse through the CLI will not be affected by this change.
Refs #9689
The
suggestion-modeoption was removed, as pylint now always emits user-friendly hints insteadof false-positive error messages. You should remove it from your conf if it's defined.
Refs #9962
The
async.pychecker module has been renamed toasync_checker.pysinceasyncis a Python keywordand cannot be imported directly. This allows for better testing and extensibility of the async checker functionality.
Refs #10071
The message-id of
continue-in-finallywas changed fromE0116toW0136. The warning isnow emitted for every Python version since it will raise a syntax warning in Python 3.14.
See PEP 765 - Disallow return/break/continue that exit a finally block.
Refs #10480
Removed support for
nmp.NaNalias fornumpy.NaNbeing recognized in ':ref:nan-comparison'. Usenpornumpyinstead.Refs #10583
Version requirement for
isorthas been bumped to >=5.0.0.The internal compatibility for older
isortversions exposed viapylint.utils.IsortDriverhasbeen removed.
Refs #10637
New Features
comparison-of-constantsnow uses the unicode from the ast instead of reformatting fromthe node's values preventing some bad formatting due to
utf-8limitation. The message now uses"instead of'to better work with what the python ast returns.Refs #8736
Enhanced pyreverse to properly distinguish between UML relationship types (association, aggregation, composition) based on object ownership semantics. Type annotations without assignment are now treated as associations, parameter assignments as aggregations, and object instantiation as compositions.
Closes #9045
Closes #9267
The
fixmecheck can now search through docstrings as well as comments, by usingcheck-fixme-in-docstring = truein the[tool.pylint.miscellaneous]section.Closes #9255
The
use-implicit-booleaness-not-xchecks now distinguish between comparisonsused in boolean contexts and those that are not, enabling them to provide more accurate refactoring suggestions.
Closes #9353
The verbose option now outputs the filenames of the files that have been checked.
Previously, it only included the number of checked and skipped files.
Closes #9357
colorized reporter now colorizes messages/categories that have been configured as
fail-onin red inverse.This makes it easier to quickly find the errors that are causing pylint CI job failures.
Closes #9898
Enhanced support for @property decorator in pyreverse to correctly display return types of annotated properties when generating class diagrams.
Closes #10057
Add --max-depth option to pyreverse to control diagram complexity. A depth of 0 shows only top-level packages, 1 shows one level of subpackages, etc.
This helps manage visualization of large codebases by limiting the depth of displayed packages and classes.
Refs #10077
Handle deferred evaluation of annotations in Python 3.14.
Closes #10149
Enhanced pyreverse to properly detect aggregations for comprehensions (list, dict, set, generator).
Closes #10236
pyreverse: add support for colorized output when using output formatmmd(MermaidJS) andhtml.Closes #10242
pypy 3.11 is now officially supported.
Refs #10287
Add support for Python 3.14.
Refs #10467
Add naming styles for
ParamSpecandTypeVarTuplethat align with theTypeVarstyle.Refs #10541
New Checks
Add
match-statementschecker and the following message:bare-name-capture-pattern.This will emit an error message when a name capture pattern is used in a match statement which would make the remaining patterns unreachable.
This code is a SyntaxError at runtime.
Closes #7128
Add new check
async-context-manager-with-regular-withto detect async context managers used with regularwithstatements instead ofasync with.Refs #10408
Add
break-in-finallywarning. Usingbreakinside thefinallyclausewill raise a syntax warning in Python 3.14.
See
PEP 765 - Disallow return/break/continue that exit a finally block <https://peps.python.org/pep-0765/>_.Refs #10480
Add new checks for invalid uses of class patterns in :keyword:
match.invalid-match-args-definitionis emitted if :py:data:object.__match_args__isn't a tuple of strings.too-many-positional-sub-patternsif there are more positional sub-patterns than specified in :py:data:object.__match_args__.multiple-class-sub-patternsif there are multiple sub-patterns for the same attribute.Refs #10559
Add additional checks for suboptimal uses of class patterns in :keyword:
match.match-class-bind-selfis emitted if a name is bound toselfinstead ofusing an
aspattern.match-class-positional-attributesis emitted if a class pattern has positionalattributes when keywords could be used.
Refs #10587
Add a
consider-math-not-floatmessage.float("nan")andfloat("inf")are slowerthan their counterpart
math.infandmath.nanby a factor of 4 (notwithstandingthe initial import of math) and they are also not well typed when using mypy.
This check also catches typos in float calls as a side effect.
The :ref:
pylint.extensions.code_styleneed to be activated for this check to work.Refs #10621
False Positives Fixed
Fix a false positive for
used-before-assignmentwhen a variable defined underan
ifand via a named expression (walrus operator) is used later when guardedunder the same
iftest.Closes #10061
Fix :ref:
no-name-in-modulefor members ofconcurrent.futureswith Python 3.14.Closes #10632
False Negatives Fixed
Fix false negative for
used-before-assignmentwhen aTYPE_CHECKINGimport is used as a type annotation prior to erroneous usage.Refs #8893
Match cases are now counted as edges in the McCabe graph and will increase the complexity accordingly.
Refs #9667
Check module-level constants with type annotations for
invalid-name.Remember to adjust
const-naming-styleorconst-rgxto your liking.Closes #9770
Fix false negative where function-redefined (E0102) was not reported for functions with a leading underscore.
Closes #9894
We now raise a
logging-too-few-argsfor format string with nointerpolation arguments at all (i.e. for something like
logging.debug("Awaiting process %s")or
logging.debug("Awaiting process {pid}")). Previously we did not raise for such case.Closes #9999
Fix false negative for
used-before-assignmentwhen a function is defined inside aTYPE_CHECKINGguard block and used later.Closes #10028
Fix a false negative for
possibly-used-before-assignmentwhen a variable is conditionally definedand later assigned to a type-annotated variable.
Closes #10421
Fix false negative for
deprecated-modulewhen a__import__method is used instead ofimportsentence.Refs #10453
Count match cases for
too-many-branchescheck.Refs #10542
Fix false-negative where :ref:
unused-importwas not reported for names referenced in a precedingglobalstatement.Refs #10633
Other Bug Fixes
When displaying unicode with surrogates (or other potential
UnicodeEncodeError),pylint will now display a '?' character (using
encode(encoding="utf-8", errors="replace"))instead of crashing. The functional tests classes are also updated to handle this case.
Closes #8736
Fixed unidiomatic-typecheck only checking left-hand side.
Closes #10217
Fix a crash caused by malformed format strings when using
.formatwith keyword arguments.Closes #10282
Fix false positive
inconsistent-return-statementswhen usingquit()orexit()functions.Closes #10508
Fix a crash in :ref:
nested-min-maxwhen usingbuiltins.minorbuiltins.maxinstead of
minormaxdirectly.Closes #10626
Fixed a crash in :ref:
unnecessary-dict-index-lookupwhen the index of an enumerated listwas deleted inside a for loop.
Closes #10627
Other Changes
Remove support for launching pylint with Python 3.9.
Code that supports Python 3.9 can still be linted with the
--py-version=3.9setting.Refs #10405
Internal Changes
Modified test framework to allow for different test output for different Python versions.
Refs #10382
v3.3.9Compare Source
What's new in Pylint 3.3.9?
Release date: 2025-10-05
False Positives Fixed
Fix used-before-assignment for PEP 695 type aliases and parameters.
Closes #9815
No longer flag undeprecated functions in
importlib.resourcesas deprecated.Closes #10593
Fix false positive
inconsistent-return-statementswhen usingquit()orexit()functions.Closes #10508
Fix false positive
undefined-variable(E0602) for for-loop variable shadowing patterns likefor item in item:when the variable was previously defined.Closes #10562
Other Bug Fixes
Fixed crash in 'unnecessary-list-index-lookup' when starting an enumeration using
minus the length of an iterable inside a dict comprehension when the len call was only
made in this dict comprehension, and not elsewhere. Also changed the approach,
to use inference in all cases but the simple ones, so we don't have to fix crashes
one by one for arbitrarily complex expressions in enumerate.
Closes #10510
v3.3.8Compare Source
What's new in Pylint 3.3.8?
Release date: 2025-08-09
This patch release includes an exceptional fix for a false negative issue. For details, see: #10482 (comment)
False Positives Fixed
Fix false positives for
possibly-used-before-assignmentwhen variables are exhaustivelyassigned within a
matchblock.Closes #9668
Fix false positive for
missing-raises-docandmissing-yield-docwhen the method length is less than docstring-min-length.Refs #10104
Fix a false positive for
unused-variablewhen multiple except handlers bind the same name under a try block.Closes #10426
False Negatives Fixed
Fix false-negative for
used-before-assignmentwithfrom __future__ import annotationsin function definitions.Refs #10482
Other Bug Fixes
Fix a bug in Pyreverse where aggregations and associations were included in diagrams regardless of the selected --filter-mode (such as PUB_ONLY, ALL, etc.).
Closes #10373
Fix double underscores erroneously rendering as bold in pyreverse's Mermaid output.
Closes #10402
v3.3.7Compare Source
What's new in Pylint 3.3.7?
Release date: 2025-05-04
False Positives Fixed
Comparisons between two calls to
type()won't raise anunidiomatic-typecheckwarning anymore, consistent with the behavior applied only for==previously.Closes #10161
Other Bug Fixes
Fixed a crash when importing a class decorator that did not exist with the same name as a class attribute after the class definition.
Closes #10105
Fix a crash caused by malformed format strings when using
.formatwith keyword arguments.Closes #10282
Using a slice as a class decorator now raises a
not-callablemessage instead of crashing. A lot of checks that dealt with decorators (too many to list) are now shortcut if the decorator can't immediately be inferred to a function or class definition.Closes #10334
Other Changes
The algorithm used for
no-membersuggestions is now more efficient and cuts thecalculation when the distance score is already above the threshold.
Refs #10277
v3.3.6Compare Source
What's new in Pylint 3.3.6?
Release date: 2025-03-20
False Positives Fixed
Fix a false positive for
used-before-assignmentwhen an inner function's return typeannotation is a class defined at module scope.
Closes #9391
v3.3.5Compare Source
What's new in Pylint 3.3.5?
Release date: 2025-03-09
False Positives Fixed
Fix false positives for
use-implicit-booleaness-not-comparison,use-implicit-booleaness-not-comparison-to-stringand
use-implicit-booleaness-not-comparison-to-zerowhen chained comparisons are checked.Closes #10065
Fix a false positive for
invalid-getnewargs-ex-returnedwhen the tuple or dict has been assigned to a name.Closes #10208
Remove
getoptandoptparsefrom the list of deprecated modules.Closes #10211
Other Bug Fixes
Fixed conditional import x.y causing false positive possibly-used-before-assignment.
Closes #10081
Fix a crash when something besides a class is found in an except handler.
Closes #10106
Fixed raising invalid-name when using camelCase for private methods with two leading underscores.
Closes #10189
Other Changes
Upload release assets to PyPI via Trusted Publishing.
Closes #10256
v3.3.4Compare Source
Other Bug Fixes
Fixes "skipped files" count calculation; the previous method was displaying an arbitrary number.
Closes #10073
Fixes a crash that occurred when pylint was run in a container on a host with cgroupsv2 and restrictions on CPU usage.
Closes #10103
Relaxed the requirements for isort so pylint can benefit from isort 6.
Closes #10203
v3.3.3Compare Source
What's new in Pylint 3.3.3?
Release date: 2024-12-23
False Positives Fixed
Fix false positives for
undefined-variablefor classes using Python 3.12generic type syntax.
Closes #9335
Fix a false positive for
use-implicit-booleaness-not-len. No lint should be emitted forgenerators (
lenis not defined for generators).Refs #10100
Other Bug Fixes
Fix
Unable to import 'collections.abc' (import-error)on Python 3.13.1.Closes #10112
v3.3.2Compare Source
False Positives Fixed
Fix a false positive for
potential-index-errorwhen an indexed iterablecontains a starred element that evaluates to more than one item.
Closes #10076
Other Bug Fixes
Fixes the issue with --source-root option not working when the source files are in a subdirectory of the source root (e.g. when using a /src layout).
Closes #10026
v3.3.1Compare Source
What's new in Pylint 3.3.1?
Release date: 2024-09-24
False Positives Fixed
Fix regression causing some f-strings to not be inferred as strings.
Closes #9947
v3.3.0Compare Source
Release date: 2024-09-20
Changes requiring user actions
We migrated
symilarto argparse, from getopt, so the error and help output changed(for the better). We exit with 2 instead of sometime 1, sometime 2. The error output
is not captured by the runner anymore. It's not possible to use a value for the
boolean options anymore (
--ignore-comments 1should become--ignore-comments).Refs #9731
New Features
Add new
declare-non-sloterror which reports when a class has a__slots__member and a type hint on the class is not present in__slots__.Refs #9499
New Checks
Added
too-many-positional-argumentsto allow distinguishing the configuration for too manytotal arguments (with keyword-only params specified after
*) from the configurationfor too many positional-or-keyword or positional-only arguments.
As part of evaluating whether this check makes sense for your project, ensure you
adjust the value of
--max-positional-arguments.Closes #9099
Add
using-exception-groups-in-unsupported-versionandusing-generic-type-syntax-in-unsupported-versionfor uses of Python 3.11+ or3.12+ features on lower supported versions provided with
--py-version.Closes #9791
Add
using-assignment-expression-in-unsupported-versionfor uses of:=(walrus operator)on Python versions below 3.8 provided with
--py-version.Closes #9820
Add
using-positional-only-args-in-unsupported-versionfor uses of positional-only args onPython versions below 3.8 provided with
--py-version.Closes #9823
Add
unnecessary-default-type-argsto thetypingextension to detect the useof unnecessary default type args for
typing.Generatorandtyping.AsyncGenerator.Refs #9938
False Negatives Fixed
Fix computation of never-returning function:
Neveris handled in addition toNoReturn, and priority is given to the explicit--never-returning-functionsoption.Closes #7565.
Fix a false negative for
await-outside-asyncwhen await is inside Lambda.Refs #9653
Fix a false negative for
duplicate-argument-nameby includingpositional-only,*argsand**kwargsarguments in the check.Closes #9669
Fix false negative for
multiple-statementswhen multiple statements are present onelseandfinallylines oftry.Refs #9759
Fix false negatives when
isinstancedoes not have exactly two arguments.pylint now emits a
too-many-function-argsorno-value-for-parameterappropriately for
isinstancecalls.Closes #9847
Other Bug Fixes
--enablewith--disable=allnow produces an error, when an unknown msg code is used. Internalpylintmessages are no longer affected by--disable=all.Closes #9403
Impossible to compile regexes for paths in the configuration or argument given to pylint won't crash anymore but
raise an argparse error and display the error message from
re.compileinstead.Closes #9680
Fix a bug where a
tox.inifile with pylint configuration was ignored and it exists in the current directory..cfgand.inifiles containing aPylintconfiguration may now use a section named[pylint]. This enhancement impacts the scenario where these file types are used as defaults when they are present and have not been explicitly referred to, using the--rcfileoption.Closes #9727
Improve file discovery for directories that are not python packages.
Closes #9764
Other Changes
Remove support for launching pylint with Python 3.8.
Code that supports Python 3.8 can still be linted with the
--py-version=3.8setting.Refs #9774
Add support for Python 3.13.
Refs #9852
Internal Changes
All variables, classes, functions and file names containing the word 'similar', when it was,
in fact, referring to 'symilar' (the standalone program for the duplicate-code check) were renamed
to 'symilar'.
Closes #9734
Remove old-style classes (Python 2) code and remove check for new-style class since everything is new-style in Python 3. Updated doc for exception checker to remove reference to new style class.
Refs #9925
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.